#include <iostream>
#include "entidades/TerminoIndexado.h"
#include "utiles/TerminoUtil.h"
#include "utiles/ArchivosUtil.h"
#include "utiles/IndiceUtil.h"
#include "Hash/GeneradorHashingPerfecto.h"
#include "compresor/CompresorNumeros.h"

using namespace std;

#define BIT_NUMBER 32


int main(int argc, char* argv[]) {
	cout << "##################Indexador################" << endl;
	if(argc < 3) {
			std::cout << "Cantidad incorrecta de parametros de entrada" << std::endl;
			std::cout << "Parametros ingresados:"<< argc << std::endl;
			//return -1;

	}
	string nombreIndice = "indice1";//StringUtil::charToString(argv[1]);
	string directorio = "../archivos/entrada/";//StringUtil::charToString(argv[2]);//"../archivos/entrada/"
	if(directorio.substr(directorio.size()-1,directorio.size()) != "/"){
		directorio+= "/";
	}

	ArchivosUtil arch;
	arch.generarArchivoInicialDesdeDirectorio(directorio,"../archivos/salida/salidas","../archivos/referencias",nombreIndice);
	arch.mergeSalidas("../archivos/salida/",nombreIndice);
	vector<string*> terminos=arch.devolverVectorTerminos("../archivos/salida/salidasPalabras-"+nombreIndice);
	vector<string*>::iterator it=terminos.begin();
	unsigned int longMaxima=0;

	for(;it!=terminos.end();++it){
		string* actual=*it;
		if(actual->size()>longMaxima){
			longMaxima=actual->size();
		}
	}
	GeneradorHashingPerfecto hash(nombreIndice,terminos,longMaxima);
	IndiceUtil util;
	util.generarIndice("../archivos/salida/salidasMerge","../archivos/salida/",nombreIndice);

	for(it=terminos.begin();it!=terminos.end();++it){
				delete(*it);
	}

	arch.borrarMergeSalidas("../archivos/salida/");
	ifstream is(("../archivos/salida/indiceAuxiliar-"+nombreIndice).c_str(),ios::binary);
	ifstream isIndex(("../archivos/salida/indice-"+nombreIndice).c_str());
	CompresorNumeros compNum;
	vector<unsigned int> numerosALlenar;
	unsigned int bytesParaSeek=0;
	is.seekg(bytesParaSeek, fstream::beg);
	compNum.descomprimirNumeros(isIndex,numerosALlenar);
	while(!isIndex.eof()){
		is.read((char*)&bytesParaSeek, sizeof(bytesParaSeek));
		//cout<<bytesParaSeek<<endl;
		is.seekg(bytesParaSeek, fstream::beg);
		compNum.descomprimirNumeros(isIndex,numerosALlenar);
	}
//	cout<<"Numeritos"<<endl;
//	for(vector<unsigned int>::iterator it=numerosALlenar.begin();it!=numerosALlenar.end();++it){
//		cout<<*it<<endl;
//	}
	is.close();

	return 0;
	/* QUIMEY TEST
	TerminoUtil utilTerminos;
	TerminoIndexado ter1("termino1", 2);
	TerminoIndexado ter2("termino1", 2);
	TerminoIndexado ter3("termino2", 5);
	vector<TerminoIndexado> terminos;
	terminos.push_back(ter1);
	terminos.push_back(ter2);
	terminos.push_back(ter3);
	utilTerminos.guardarTerminosEnArchivo(terminos,"salidasprueba");
	return 0;*/

	/*MARCOS TEST
	 * 	CompresorNumeros compNum;
	vector<unsigned int> numeros;
	vector<unsigned int> numerosALlenar;
	ofstream os("prueba.bin");
	numeros.push_back(3);

	numeros.push_back(3);
	numeros.push_back(3);
	numeros.push_back(4);
	numeros.push_back(312);
	numeros.push_back(423);

	numeros.push_back(4);

	numeros.push_back(3);
	numeros.push_back(4);
	numeros.push_back(31456);
	numeros.push_back(9);

	numeros.push_back(6);

	numeros.push_back(1);
	numeros.push_back(4);

	compNum.comprimirNumeros(os,numeros);
	os.close();
	printf("\n");
	printf("\n");
	ifstream is("prueba.bin");
	is.seekg(0, fstream::beg);
	compNum.descomprimirNumeros(is,numerosALlenar);
	printf("\n");
		printf("\n");
	vector<unsigned int>::iterator it = numeros.begin();
		for (; it != numeros.end(); ++it) {
			printf("Num: %i\n",*it);
		}


	 */



}
